Όχι ότι δεν υπάρχει τρόπος να έχεις μία και μοναδική σειριακή, αλλά γιατί να έχεις πρόσβαση σε αυτή από κάθε φόρμα? Κάθε φόρμα χειρίζεται τη θύρα με διαφορετικό τρόπο? Θέλεις δύο φόρμες να ακούνε ή να μιλάνε με τη θύρα ταυτόχρονα? Μάλλον πρέπει να ξανασκεφτείς τη σχεδίαση σου.
Εκτός και αν χρησιμοποιείς τη θύρα για διαφορετικούς λόγους σε κάθε φόρμα (κάτι που ακούγεται περίεργο) ή θέλεις πολλές φόρμες να παίζουν με την ίδια θύρα ταυτόχρονα (που ακούγεται παράλογο) είναι καλύτερα να κρύψεις τη θύρα μέσα σε μία μόνο κλάση. Η κλάση αυτή θα είναι υπεύθυνη και για το άνοιγμα/κλείσιμο της θύρας αλλά κυρίως για να υλοποιεί τις λειτουργίες για τις οποίες θέλεις τη θύρα. Όχι κάθε φόρμα ξεχωριστά, αυτή η κλάση και μόνο. Για παράδειγμα, αν θέλεις να μιλήσεις με ένα GPS η κλάση αυτή θα πρέπει να έχει κάποιο event που σηκώνει κάθε φορά που δέχεται συντεταγμένες. Αν θέλεις να στείλεις μηνύματα μέσω κάποιου modem, η κλάση αυτή θα έχει μεθόδους SendMessage, ReceiveMessage. Καμμία άλλη κλάση ή φόρμα δεν θα πρέπει ούτε να χρησιμοποιεί ούτε καν να ξέρει ότι υπάρχει η σειριακή.
Η υπόλοιπη εφαρμογή σου θα πρέπει να επικοινωνεί με τη σειριακή μόνο μέσω αυτής της κλάσης. Μπορείς να φτιάξεις ένα instance όταν ξεκινάει η εφαρμογή σου και να το περνάς σε κάθε φόρμα ως παράμετρο π.χ. στον constructor, ή ως property. Κάθε φόρμα μετά θα καλεί τις κατάλληλες μεθόδους σε αυτή την κλάση.
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos